package demo9;

import java.util.Comparator;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        //Cat类型数据，用它的父类Animal类型的比较器，可以正常使用，完成排序
        // 因为Comparator是一个使用通配符下限的接口
        TreeSet<Cat> cat1 = new TreeSet<>(new Comparator1());
        cat1.add(new Cat("shuzhi",6));
        cat1.add(new Cat("zhengxiatou",1));
        cat1.add(new Cat("baojing",3));
        System.out.println(cat1.toString());

        //Cat类型数据，用Cat类型的比较器可以完成排序
        TreeSet<Cat> cats2 = new TreeSet<>(new Comparator2());

        //报错，因为Comparator3实现了Comparator这个接口，而这个接口用了通配符下限。
        //在这个例子里下限就是Cat类型的比较器，可以选择Cat或者它父类Animal类型的比较器
        // 而Comparator3是以Cat的子类MiniCat为类型做的比较器，所以错误
        //TreeSet<Cat> cat3 = new TreeSet<>(new Comparator3());



    }
}


//比较器1：比较Animal类型里的name元素
class Comparator1 implements Comparator<Animal> {

    //比较器实现用通配符下限设置的接口Comparator。
    //重写compare方法后，compareTo已经被重写，所以能比较字符串，而不是比较数值或地址。
    @Override
    public int compare(Animal o1, Animal o2) {
        return o1.name.compareTo(o2.name);
    }
}
//比较器2：比较Cat类型里的age元素
class Comparator2 implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        return o1.age - o2.age;
    }
}
//比较器3：比较MiniCat类型里的level元素
class Comparator3 implements Comparator<MiniCat> {
    @Override
    public int compare(MiniCat o1, MiniCat o2) {
        return o1.level - o2.level;
    }
}